home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / pof11 / pof.c < prev    next >
C/C++ Source or Header  |  1993-07-06  |  9KB  |  483 lines

  1. /*
  2.  *    POF! - Plenty Of Files
  3.  *    ----------------------
  4.  *
  5.  *    POF! is a file list maker for BBS systems having files.bbs-like
  6.  *    download areas.
  7.  *
  8.  *    Public domain: this program may be copied and sold freely.
  9.  *
  10.  *    Porting: under unix it should be easy, all defines are below, 
  11.  *    and just compile with "cc -DUNIX -DNO_LDIFFTIME -o pof -c pof.c".
  12.  *    Potential unix problems: long filenames, case.
  13.  */
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <time.h>
  18. #include <stdarg.h>
  19. #include <string.h>
  20. #include <ctype.h>
  21.  
  22. #include <sys/types.h>    /* for download */
  23. #include <sys/stat.h>
  24.  
  25. /* all configuration is here */
  26. #ifdef ATARI /* Atari ST */
  27. #define POFVERS "1.1/tos"
  28. #define SYSSEPAR '\\'
  29. #define SYSSTRSEPAR "\\"
  30. #endif
  31. #ifdef UNIX /* Unix (tested on BSD,etc) */
  32. #define POFVERS "1.1/unix"
  33. #define SYSSEPAR '/'        /* directory separator */
  34. #define SYSSTRSEPAR "/"
  35. #define stricmp strcasecmp
  36. #define strnicmp strncasecmp
  37. #endif
  38. #ifdef WIN32 /* Windows NT */
  39. #define POFVERS "1.1/wnt"
  40. #define SYSSEPAR '\\'
  41. #define SYSSTRSEPAR "\\"
  42. #endif
  43.  
  44. /*efine NO_LDIFFTIME */     /* define if you don't want to use the ansi difftime 
  45.                                 that requires float point libs, and if your system
  46.                                 time_t is in seconds since sometimes */
  47.  
  48. /* more config, don't change normally */
  49. #define POFSTR 150
  50. #define FILESBBS "files.bbs"
  51. #define FBBSCUTLEN  45    /* download() */
  52. #define FBBSSTRINGLEN 31
  53. #ifdef NO_LDIFFTIME
  54. #define difftime(a,b) (a-b)
  55. #endif
  56.  
  57. #define DEBUG /**/
  58.  
  59. int total_files=0;
  60. long total_kb=0;
  61. int total_missing=0;
  62.  
  63. /* ================================================== UTILITY FUNCTIONS */
  64.  
  65. /*
  66.  * Insert one space at the beginning of a string
  67.  */
  68.  
  69. void strspins(char *str)
  70. {
  71.     int maxlen,i;
  72.     
  73.     maxlen=strlen(str);
  74.     
  75.     for(i=maxlen+1;i>=0;i--)
  76.         str[i+1]=str[i];
  77.     str[0]=' ';
  78. }
  79.  
  80. /*
  81.  *    strcln: remove a char from string
  82.  */
  83.  
  84. void strcln(char *string, char c)
  85. {
  86.     char *s=string;
  87.     while(*s)
  88.     {
  89.         if((c!=-1 && *s==c) || (c==-1 && *s<0x20 && *s>0))
  90.             strcpy(s,s+1);
  91.         s++;
  92.     }
  93. }
  94.  
  95. /*
  96.  *    add a directory separator at the end of a string if !there
  97.  */
  98.  
  99. void addslash(char *s)
  100. {
  101.     if(*s)
  102.     {
  103.         if(s[strlen(s)-1]!=SYSSEPAR)
  104.             strcat(s,SYSSTRSEPAR);
  105.     }
  106. }
  107.  
  108. /*
  109.  * find next string format "plouf <tab>tralala ; comment 
  110.  */
  111.  
  112. char *nextstr(char *str)
  113. {
  114.     char* s=str;
  115.     
  116.     while((*s!='\0') && (*s!=' ') && (*s!='\x09'))
  117.         s++;
  118.         
  119.     if(*s=='\0')
  120.         return NULL;
  121.  
  122.     while((*s==' ') || (*s=='\x09'))
  123.         s++;
  124.     
  125.     if((*s=='\0') || (*s==';'))
  126.         return NULL;
  127.         
  128.     return s;
  129. }
  130.  
  131. /*
  132.  * copy string until space (in dest)
  133.  */
  134.  
  135. void strspacecpy(char *dest, char *srce)
  136. {
  137.     int i=0,j=0;
  138.     
  139.     while((srce[i]!='\0') && (srce[i]!=' ') && (srce[i]!='\x09') && (i<POFSTR))
  140.     {
  141. /* fixme: unsigned  char ? */
  142.         if(srce[i]>' ')
  143.         {
  144.             dest[j]=srce[i];
  145.             j++;
  146.         }
  147.         i++;
  148.     } 
  149.     dest[i]='\0';
  150. }
  151.  
  152. /* ================================================= LOG FILE FUNCTIONS */
  153.  
  154. FILE *logfile=NULL;
  155.  
  156. /* 
  157.  * logline: Log a line in the logfile and output to screen 
  158.  */
  159.  
  160. void logline(char *line, ...)
  161. {
  162.     time_t    timer;
  163.     char    temp[100], out[100],tdate[20];
  164.     va_list param;
  165.     struct tm *tim;
  166.     
  167.     if(!logfile)
  168.         return;    /* error */
  169.         
  170.     /* process */
  171.     va_start(param, line);
  172.     vsprintf(temp, line, param);
  173.     va_end(param);
  174.     time (&timer);
  175.     tim = localtime (&timer);
  176.     strftime (tdate, 20, "%d %b %H:%M:%S", tim);
  177.     sprintf (out, "+ %s POF  %s", tdate, temp);
  178.  
  179.     /* log to file */
  180.     fputs(out,logfile);
  181. #ifdef DEBUG
  182.     fflush(logfile);
  183. #endif
  184. }
  185.  
  186. /* 
  187.  *    openlog: create logfile 
  188.  */
  189.  
  190. void open_the_log(char *nm)
  191. {
  192.     logfile=fopen(nm,"a");
  193.     if(logfile)
  194.         return;
  195.     
  196.     printf("Can't open logfile!\n");
  197. }
  198.  
  199. /* 
  200.  * closelog: close logfile 
  201.  */
  202.  
  203. void close_the_log(void )
  204. {
  205.     if(logfile)
  206.         fclose(logfile);
  207. }
  208.  
  209.  
  210. /* 
  211.  * process @ line 
  212.  */
  213.  
  214. void include(char *text)
  215. {
  216.     char oneline[POFSTR];
  217.     FILE *txt;
  218.     
  219.     if(!text)
  220.         return;
  221.         
  222.     txt=fopen(text,"r");
  223.     if(txt)
  224.     {
  225.         while(fgets(oneline,POFSTR,txt))
  226.         {
  227.             strcln(oneline,-1);
  228.             if(strlen(oneline)>79)
  229.                 oneline[78]=0;
  230.             puts(oneline);
  231.         }
  232.         fclose(txt);
  233.     }
  234.     else 
  235.         logline("Error including text");
  236. }
  237.  
  238. /* 
  239.  * process area line 
  240.  */
  241.  
  242. void doarea(char *area, int days)
  243. {
  244.     struct stat mystat;
  245.     char area2[POFSTR];
  246.     char *temp;
  247.     char file[POFSTR];
  248.     char filebbs[POFSTR];
  249.     FILE *fbbs;
  250.     time_t now;
  251.     int i;
  252.     
  253.     int area_files=0;
  254.     long area_kb=0;
  255.         
  256.     /* get now */
  257.     time(&now);
  258.     
  259.     /* clean copy of area */
  260.     strcpy(area2,area);
  261.     addslash(area2);
  262.     
  263.     strcpy(filebbs,area2);
  264.     strcat(filebbs,FILESBBS);
  265.     
  266.     fbbs=fopen(filebbs,"r");
  267.     if(!fbbs)
  268.         logline("Can't find %s in area %s",filebbs,area);
  269.     else
  270.     {
  271.         temp=malloc((POFSTR*10)+1);
  272.         if(!temp)
  273.             logline("Can't malloc temp buffer in doarea()");
  274.         else
  275.         {
  276.             while(fgets(temp,POFSTR*10,fbbs))
  277.             {    
  278.                 if(!isalnum(*temp)) /* thats a comment */
  279.                 {
  280.                     strcln(temp,-1);
  281.                     if(strlen(temp)>75)
  282.                         temp[72]=0;
  283.                     puts(temp);
  284.                 }
  285.                 else
  286.                 { /* that's a file name */
  287.                     char filen[POFSTR];
  288.                     char unknown[POFSTR];
  289.                     char date[POFSTR];
  290.                     char *desc;
  291.                     int lastspace,idx,lastcut;
  292.             
  293.                     strcpy(unknown,"-none-");
  294.                 
  295.                     strcpy(file,area2); /* file <area>\<file> */
  296.                     strspacecpy(filen,temp);
  297.                     strcat(file,filen);
  298.             
  299.                     desc=nextstr(temp); /* desc: description */
  300.                     if(!desc) desc=unknown;
  301.                     strcln(desc,-1);
  302.             
  303.                     /* multiline */
  304.                     idx=0;
  305.                     lastspace=0;
  306.                     lastcut=0;
  307.                     while(desc[idx])
  308.                     {
  309.                         if(desc[idx]==' ')
  310.                             lastspace=idx;
  311.                 
  312.                         if((idx-lastcut)>FBBSCUTLEN)
  313.                         {
  314.                             for(i=0;i<FBBSSTRINGLEN;i++)
  315.                                 strspins(desc+lastspace+1+i);
  316.                             desc[lastspace+1]='\n';
  317.                             lastcut=idx=lastspace+FBBSSTRINGLEN;
  318.                         }
  319.                         idx++;
  320.                     }
  321.                 
  322.                 
  323.                     if(stat(file,&mystat))
  324.                     {
  325.                         printf("%-12.12s *** MISSING *** %s\n",filen,desc);
  326.                         total_missing++;
  327.                     }
  328.                     else
  329.                     {
  330.                         if(    (days<=0) || 
  331.                             ((difftime(now,mystat.st_mtime)/86400) <= days) )
  332.                         {
  333.                             #ifdef STANDARD_DE_MERDE
  334.                              strftime(date,POFSTR,"%y-%m-%d",localtime(&mystat.st_mtime));
  335.                             #else
  336.                              strftime(date,POFSTR,"%d %b %y",localtime(&mystat.st_mtime));
  337.                             #endif
  338.                             printf("%-12.12s %6ld %s %s\n",filen,(long) mystat.st_size,date,desc);
  339.                             area_files++;
  340.                             total_files++;
  341.                             area_kb+=mystat.st_size/1024;
  342.                             total_kb+=mystat.st_size/1024;
  343.                         }
  344.                     }
  345.                 }/* not a file name */
  346.             } 
  347.             free(temp);
  348.         } /* malloc */
  349.         fclose(fbbs);
  350.     } /* file */
  351.     
  352.     printf("\n  Number of files in this area: %d\n",area_files);
  353.     printf("  Size of the area: %ld KB\n\n\n",area_kb);
  354.     
  355.     return;
  356. }
  357.  
  358. /*
  359.  *    process .pof file
  360.  */
  361.  
  362. void process(char *config, int days)
  363. {
  364.     FILE *txt;
  365.     char date[POFSTR];
  366.     char oneline[POFSTR];
  367.     time_t now;
  368.     
  369.     int total_area=0;
  370.     
  371.     time(&now);
  372.         
  373.     if(!config)
  374.         return;
  375.     
  376.     txt=fopen(config,"r");
  377.     if(!txt)
  378.     {
  379.         logline("Can't read config file");
  380.         return;
  381.     }
  382.     else
  383.     {
  384.         strftime(date,POFSTR,"%d %B %Y at %H:%M",localtime(&now));
  385.         if(days<=0)
  386.             printf(" Full filelist compiled on %s by POF! vers. %s.\n\n",date,POFVERS);
  387.         else
  388.             printf(" Filelist of NEW FILES SINCE %d DAYS compiled on %s.\n\n",days,date);
  389.         
  390.         while(fgets(oneline,POFSTR,txt))
  391.         {
  392.             if(strlen(oneline)>1)
  393.             {
  394.                 strcln(oneline,-1);
  395.                 
  396.                 if(oneline[0]=='@')
  397.                     include(oneline+1);
  398.                 else if(oneline[0]=='#')
  399.                     puts(oneline+1);
  400.                 else if(oneline[0]==';')
  401.                     ;
  402.                 else
  403.                 {
  404.                     doarea(oneline,days);
  405.                     total_area++;
  406.                 }
  407.             }
  408.         }
  409.         fclose(txt);
  410.     }
  411.     
  412.     printf("\n\n  Stats:\n  ------\n\n");
  413.     printf("  Total number of files      : %d\n",total_files);
  414.     printf("  Total size of listed files : %d KB\n",total_kb);
  415.     printf("  Average file lenght        : %d KB\n",total_kb/total_files);
  416.     printf("  Number of areas listed     : %d\n",total_area);
  417.     printf("  Number of missing file(s)  : %d\n\n\n",total_missing);
  418.     
  419.     if(days<=0)
  420.         printf(" Full filelist compiled on %s by POF! vers. %s.\n\n",date,POFVERS);
  421.     else
  422.         printf(" Filelist of NEW FILES SINCE %d DAYS compiled on %s.\n\n",days,date);
  423. }
  424.  
  425. /* ============================================================= MAIN */
  426.  
  427. void usage(void )
  428. {
  429.     printf("pof: [-d<keepdays>] [-l<logfile>] config-file\n\n");
  430. }
  431.  
  432. int main(int argc, char **argv)
  433. {    
  434.     char myconfig[POFSTR];
  435.     int keepdays=0;
  436.     int i;
  437.  
  438.     myconfig[0]=0;
  439.     
  440.     /* parse command line */
  441.     for(i=1;i<argc;i++)
  442.     {    
  443.         if(!strnicmp(argv[i],"-l",2))
  444.             open_the_log(argv[i]+2);
  445.         else if(!strnicmp(argv[i],"-d",2))
  446.             keepdays=atoi(argv[i]+2);
  447.         else if(argv[i][0]!=0)
  448.         {
  449.             if(myconfig[0])
  450.             {
  451.                 usage();
  452.                 return 1;
  453.             }
  454.             
  455.             strcpy(myconfig,argv[i]);
  456.         }
  457.         else
  458.         {
  459.             usage();
  460.             return 1;
  461.         }
  462.     }
  463.     
  464.     if(myconfig[0]==0)
  465.     {
  466.         usage();
  467.         return 2;
  468.     }
  469.     
  470.     process(myconfig,keepdays);
  471.     
  472.     if(keepdays<=0)
  473.         logline("Full filelist produced. %d files, %d KB, %d missing.\n",
  474.             total_files, total_kb, total_missing);
  475.     else
  476.         logline("Filelist (last %d). %d files, %d KB, %d missing.\n",
  477.             keepdays, total_files, total_kb, total_missing);
  478.     
  479.     close_the_log();
  480.     return 0;
  481. }
  482.  
  483. /*eof*/